/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package descente;

import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Hippolyte
 */
public class commerce {

    public static final int X_MAX = 800;
    public static final int Y_MAX = 600;

    public static void main(String[] args) {
        ArrayList<Point> villes = init(5);

//        float coutChemin;
//
//        villes.add(new Point(0, 0, 'A'));
//        villes.add(new Point(0, 0, 'B'));
//        villes.add(new Point(0, 0, 'C'));
//        villes.add(new Point(0, 0, 'D'));
//        villes.add(new Point(0, 0, 'E'));



        afficher(villes);
        inverse(villes);
        afficher(villes);
        inverse(villes);
        afficher(villes);
        inverse(villes);
        afficher(villes);

    }

    public static void inverse(ArrayList<Point> villes) {
        int min;
        int max;
        min = (int) (Math.random() * (villes.size() - 2));
        max = (int) (Math.random() * (villes.size() - min) + min);

        System.out.println(min);
        System.out.println(max);

        Point temp;

        while (min <= max) {
            temp = villes.get(min);
            try {
                villes.set(min, (Point) villes.get(max).clone());
                villes.set(max, (Point) temp.clone());
            } catch (CloneNotSupportedException ex) {
                System.out.println(ex);
            }
            min++;
            max--;
        }
    }

    public static ArrayList<Point> inverse2(ArrayList<Point> villes) {

        ArrayList<Point> retour = (ArrayList<Point>) villes.clone();
        int min;
        int max;
        min = (int) (Math.random() * (retour.size() - 2));
        max = (int) (Math.random() * (retour.size() - min) + min);

//        System.out.println(min);
//        System.out.println(max);

        Point temp;

        while (min <= max) {
            temp = retour.get(min);
            try {
                retour.set(min, (Point) retour.get(max).clone());
                retour.set(max, (Point) temp.clone());
            } catch (CloneNotSupportedException ex) {
                System.out.println(ex);
            }
            min++;
            max--;
        }
//        afficher(retour);
        return retour;
    }

    public static void afficher(ArrayList<Point> villes) {
        String affiche = "";
        for (Point p : villes) {
            affiche += p.nom + " | ";
        }
        affiche = affiche.substring(0, affiche.lastIndexOf(" | "));
        affiche += " ==> " + coutChemin(villes);
        System.out.println(affiche);
    }

    public static float coutChemin(ArrayList<Point> villes) {
        //cout initialisé au cout du premier vers dernier point
        float cout = 0;
        for (int i = 0; i < villes.size() - 1; i++) {
//            Recuit.f.pan.dessinerLigne(villes.get(i), villes.get(i + 1));
            cout += villes.get(i).distance(villes.get(i + 1));
        }
        //cout initialisé au cout du premier vers dernier point
//        Recuit.f.pan.dessinerLigne(villes.get(villes.size() - 1), villes.get(0));
        cout += villes.get(villes.size() - 1).distance(villes.get(0));
        return cout;
    }

    public static ArrayList<Point> init(int nb) {
        ArrayList<Point> villes = new ArrayList<>();
        float x;
        float y;
        String nom;
        for (int i = 0; i < nb; i++) {
            nom = "p" + i;
            x = (float) (Math.random() * (X_MAX));
            y = (float) (Math.random() * (Y_MAX));
            villes.add(new Point(x, y, nom));
            System.out.println(nom + " | " + x + " | " + y);
//            Recuit.f.pan.dessinerPoint((int) x, (int) y);
            
            
//            try {
//                Thread.sleep(100);
//            } catch (InterruptedException ex) {
//                Logger.getLogger(Recuit.class.getName()).log(Level.SEVERE, null, ex);
//            }

        }

        return villes;
    }
}
